/**
 * 聊天路由
 *
 * @author bian
 * @createDate 2016.8.26
 */
// local module
var crypto = require("crypto");

// library module
var js2xmlparser = require("js2xmlparser");

// my module
var logger = require("../instances/log");
var token = require("../conf/config").Token;
var utilx = require("../lib/utilx");
var xmlParse = require("../lib/xml");
var messageEmitter = require("../socket/event");
var Task = require("../task/index");

var wechatConfig = require("../task/config.json");
var task  = new Task(wechatConfig.testAppId,wechatConfig.testAppSecret);
var pkg = require("../package.json");
var sceneId = pkg.scene_id;

module.exports = (router) => {
    /**
     * 检查发过来的是否是微信官方的消息
     * @param query
     * @returns {boolean}
     */
    var checkSignature = function(query){
        var timestamp = query.timestamp
            ,nonce = query.nonce
            ,signature = query.signature;

        var tmpArr = [timestamp,nonce,token];
        tmpArr.sort();
        var tmpStr = `${tmpArr[0]}${tmpArr[1]}${tmpArr[2]}`;

        const hash = crypto.createHash("sha1");
        var encrypted = hash.update(tmpStr,"utf8").digest("hex");
        return encrypted === signature;
    };

    /**
     * 微信接口测试路由
     */
    router.get("/wechatCheck",function *(){
        var ctx = this;
        ctx.checkQuery("timestamp").notEmpty();     // 检查参数
        ctx.checkQuery("nonce").notEmpty();
        ctx.checkQuery("echostr").notEmpty();
        ctx.checkQuery("signature").notEmpty();
        if(ctx.errors){
            ctx.body = utilx.msgWrapper(ctx.errors,true);
            return;
        }
        var query = ctx.request.query;

        var echostr = query.echostr;
        ctx.body = checkSignature(query) ? echostr : "Invalid";
    });

    /**
     * 微信聊天信息接受路由
     */
    router.post("/wechatCheck",function *(){
        "use strict";
        var ctx = this;
        ctx.checkQuery("timestamp").notEmpty();     // 检查参数
        ctx.checkQuery("nonce").notEmpty();
        ctx.checkQuery("openid").notEmpty();
        ctx.checkQuery("signature").notEmpty();
        if(ctx.errors){
            ctx.body = utilx.msgWrapper(ctx.errors,true);
            return;
        }
        var data = yield xmlParse(ctx);     // 解析数据

        logger.info(data);      // 记录数据
        var userId;
        var msgType;
        var msgId;
        var content;
        var myAccount;
        var returnData = "";

        msgType = data.xml.MsgType[0];
        if(msgType === "text"){     // 如果是文本消息

            userId = data.xml.FromUserName[0];
            content = data.xml.Content[0];
            myAccount = data.xml.ToUserName[0];
            msgId = data.xml.MsgId[0];

            // var userInfo = yield task.getUserInfo(userId);
            var userInfo = {headImg: "http://12313123",nickName : "卞留念"};
            messageEmitter.emit("a new message",{           // 发送用户消息
                userInfo : userInfo,
                content : content,
                id : msgId
            });
            // 需要检测用户是否在上墙活动中

            returnData = {
                ToUserName : userId,
                FromUserName : myAccount,
                CreateTime : new Date().getTime(),
                MsgType : "text",
                Content : eval(content),
            };
            returnData = js2xmlparser("xml",returnData);
            // logger.debug(returnData);

        }else if(msgType === "event"){      // 如果是事件

            var event = data.xml.Event[0];
            if(event === "subscribe"){

                // 如果是扫描了二维码而且扫描的二维码是当前app的情景模式
                if(data.xml.EventKey[0]  && data.xml.EventKey[0].replace("qrscene_","") == sceneId){
                    logger.info("需要将当前用户加入上墙活动,同时防止二次上墙");
                    messageEmitter.emit("a new user");      // 发送新增用户事件
                }

            }else if(event === "unsubscribe"){

                logger.info("需要从当前上墙活动中删除");

            }else if(event === "SCAN"){

                logger.info("已经关注的用户加入了进来,需要将当前用户加入上墙活动,同时防止二次上墙");

            }

        }
        ctx.body = returnData;
    });
};